package sy6_Behavioral_Pattern.memento;
/*
 * 备忘录模式：在不破坏封装的前提下，捕获一个对象的内部状态，并在该对象之外保存这个状态，
 *            这样就可以在以后将对象恢复到原先保存的状态。
 * Originator：原发器，需要保存内部状态的对象。
 * Memento：备忘录用于存储原发器的内部状态。
 * Caretaker：管理者，负责保存备忘录。
 * 要点：Originator与Memento包含相同的状态属性， Caretaker通常会聚合Memento对象。
 * 说明：本例只能实现一次Undo
 */

class Memento{  //备忘录，相当于一个实体类
	private String state;
	public Memento(String state) {  //构造方法
		this.state = state;
	}
	public String getState() {
		return state;
	}
}

class Originator{  //角色：原发器Originator，提供了创建备忘录对象保存当前状态和恢复备忘录的方法
	private String state;
	public String getState() {
		return state;
	}
	public void setState(String state) {
		this.state = state;
	}
	public Memento createMemento() {  //保存当前状态至备忘录对象
		return new Memento(state);
	}
	public void setMemento(Memento memento) {  //通过备忘录对象恢复到历史的状态；不是类属性的setter
		state=memento.getState();
	}
}

class Caretaker{  //看管者——管理备忘录对象（保存和获取，不能修改）
	private Memento memento;  //聚合关系
	public Memento getMemento() {  //getter
		return memento;
	}
	public void setMemento(Memento memento) {  //setter
		this.memento = memento;
	}
}

public class Client {  //客户端
	public static void main(String[] args) {
		Originator originator = new Originator();  //创建一个游戏角色
		Caretaker caretaker = new Caretaker();    //创建游戏角色状态看管者
		
		originator.setState("状态#1 攻击力 100");
		System.out.println("当前状态："+originator.getState());
		
		caretaker.setMemento(originator.createMemento());  //保存当前状态
		
		originator.setState("状态#2 攻击力 80");
		System.out.println("当前状态："+originator.getState());
		
		//撤销：只能Undo到上一状态
		System.out.println("==撤销（Undo）到上一状态==");
		originator.setMemento(caretaker.getMemento());  //原发器通过看管者恢复状态
		System.out.println("当前状态："+originator.getState());
	}
}
